home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 038a / qbsbkit.zip / FMIBNK.BAS < prev    next >
BASIC Source File  |  1991-05-05  |  7KB  |  281 lines

  1.  
  2. 'QBXSBC FMIBNK.BAS
  3. 'read AdLib instrument BNK file and play some notes for each instrument
  4. '5-May-1991
  5.  
  6. DEFINT A-Z
  7.  
  8. REM $INCLUDE: 'QBXIOL.BI'
  9. REM $INCLUDE: 'QBXCTV.BI'
  10. REM $INCLUDE: 'QBXFMI.BI'
  11.  
  12. TYPE BnkHdrTYPE
  13. MajVer AS STRING * 1
  14. MinVer AS STRING * 1
  15. Signature AS STRING * 6
  16. UsedSlots AS INTEGER
  17. TotalSlots AS INTEGER
  18. AbsNameOffset AS LONG
  19. AbsDataOffset AS LONG
  20. filler AS STRING * 8
  21. END TYPE
  22.  
  23. TYPE InsNameTYPE
  24. IndexNum AS INTEGER
  25. UsedFlag AS STRING * 1
  26. Instrument AS STRING * 8
  27. Null AS STRING * 1
  28. END TYPE
  29.  
  30. TYPE OperatorTYPE
  31. KeyScaleLevel AS STRING * 1
  32. FreqMult AS STRING * 1
  33. FeedBack AS STRING * 1
  34. Attack AS STRING * 1
  35. Sustain AS STRING * 1
  36. Sustaining AS STRING * 1
  37. Decay AS STRING * 1
  38. Release AS STRING * 1
  39. zOutput AS STRING * 1
  40. AmpVib AS STRING * 1
  41. FreqVib AS STRING * 1
  42. EnvScale AS STRING * 1
  43. SnythMode AS STRING * 1
  44. END TYPE
  45.  
  46. TYPE InsDataTYPE
  47. Percussion AS STRING * 1
  48. VoiceNum AS STRING * 1
  49. Modulator AS OperatorTYPE
  50. Carrier AS OperatorTYPE
  51. ModulatorWF AS STRING * 1
  52. CarrierWF AS STRING * 1
  53. END TYPE
  54.  
  55. DIM SHARED BnkHdr AS BnkHdrTYPE
  56. DIM SHARED InsData AS InsDataTYPE
  57.  
  58. 'FMSetTimbre requires data in word form (2-bytes per)
  59. DIM SHARED InsDataW(1 TO 28) AS INTEGER
  60.  
  61. CLS
  62. BnkFile$ = "STANDARD.BNK"
  63.  
  64. PRINT "FMIBNK.BAS for QBXSBC"
  65.  
  66. stat = FMdetect(&H388)
  67. IF stat THEN
  68.    PRINT "FM chip not detected"
  69.    STOP
  70. END IF
  71.  
  72. stat = FMInit(Version)
  73. IF stat THEN
  74.    PRINT "No SOUND driver loaded"
  75.    STOP
  76. ELSE
  77.    LOCATE 1, 25: PRINT "SOUND v"; LTRIM$(STR$(Version))
  78. END IF
  79.  
  80. LOCATE 1, 38
  81. PRINT "Cursor-SpaceBar-Esc-±"
  82.  
  83. OPEN BnkFile$ FOR BINARY AS #1
  84.  
  85. 'read the header
  86. GET #1, , BnkHdr
  87.  
  88. IF BnkHdr.Signature <> "ADLIB-" THEN
  89.    PRINT "Not a BNK file"
  90.    STOP
  91. END IF
  92.  
  93. Instruments = BnkHdr.UsedSlots - 1
  94. REDIM InsNames(0 TO Instruments) AS InsNameTYPE
  95.  
  96. 'read all the instrument name records
  97. GET #1, BnkHdr.AbsNameOffset + 1, InsNames(0)
  98. FOR i = 1 TO BnkHdr.UsedSlots - 1
  99.    GET #1, , InsNames(i)
  100. NEXT
  101.  
  102. 'display instrument names
  103. LOCATE 2, 1
  104. FOR i = 0 TO Instruments
  105.    IF i MOD 8 = 0 THEN PRINT : LOCATE , 4
  106.    PRINT InsNames(i).Instrument; " ";
  107. NEXT
  108.  
  109. LOCATE 1, 61: PRINT "KBX:  0"
  110. LOCATE 1, 71: PRINT "Index:"
  111. LOCATE 2, 1
  112. 'play a scale for each instrument
  113.  
  114. i = 0
  115. DO
  116.    rowpos = i \ 8
  117.    colpos = i MOD 8
  118.  
  119.    AbsPtr& = BnkHdr.AbsDataOffset + (1& * InsNames(i).IndexNum * LEN(InsData)) + 1
  120.    LOCATE 1, 77: PRINT LTRIM$(STR$(InsNames(i).IndexNum))
  121.  
  122.    ThisRow = rowpos + 3
  123.    ThisColumn = colpos * 9 + 4
  124.  
  125.    COLOR 15, 0: LOCATE ThisRow, ThisColumn
  126.    PRINT InsNames(i).Instrument; " ";
  127.  
  128.    GET #1, AbsPtr&, InsData
  129.    GOSUB Byte2Word
  130.    GOSUB PlayTune
  131.    COLOR 7, 0: LOCATE ThisRow, ThisColumn
  132.    PRINT InsNames(i).Instrument; " ";
  133.  
  134.    SELECT CASE ikey
  135.    CASE 0
  136.       i = i + 1
  137.    CASE ASC("+")
  138.       FMGetKBXpose xpose
  139.       xpose = xpose + 1
  140.       IF xpose > 96 THEN xpose = 96
  141.       FMSetKBXpose xpose
  142.       LOCATE 1, 65: PRINT USING "###"; xpose
  143.    CASE ASC("-")
  144.       FMGetKBXpose xpose
  145.       xpose = xpose - 1
  146.       IF xpose < -96 THEN xpose = -96
  147.       FMSetKBXpose xpose
  148.       LOCATE 1, 65: PRINT USING "###"; xpose
  149.    CASE 27
  150.       EXIT DO
  151.    CASE 1072
  152.       i = i - 8
  153.    CASE 1075
  154.       i = i - 1
  155.    CASE 1077
  156.       i = i + 1
  157.    CASE 1080
  158.       i = i + 8
  159.    CASE ELSE
  160.    END SELECT
  161.    IF i > Instruments THEN i = 0
  162.    IF i < 0 THEN i = Instruments
  163.  
  164. LOOP
  165.  
  166. LOCATE 24, 1
  167. STOP
  168. SYSTEM
  169.  
  170. Byte2Word:
  171. InsDataW(1) = ASC(InsData.Modulator.KeyScaleLevel)
  172. InsDataW(2) = ASC(InsData.Modulator.FreqMult)
  173. InsDataW(3) = ASC(InsData.Modulator.FeedBack)
  174. InsDataW(4) = ASC(InsData.Modulator.Attack)
  175. InsDataW(5) = ASC(InsData.Modulator.Sustain)
  176. InsDataW(6) = ASC(InsData.Modulator.Sustaining)
  177. InsDataW(7) = ASC(InsData.Modulator.Decay)
  178. InsDataW(8) = ASC(InsData.Modulator.Release)
  179. InsDataW(9) = ASC(InsData.Modulator.zOutput)
  180. InsDataW(10) = ASC(InsData.Modulator.AmpVib)
  181. InsDataW(11) = ASC(InsData.Modulator.FreqVib)
  182. InsDataW(12) = ASC(InsData.Modulator.EnvScale)
  183. InsDataW(13) = ASC(InsData.Modulator.SnythMode)
  184. InsDataW(14) = ASC(InsData.Carrier.KeyScaleLevel)
  185. InsDataW(15) = ASC(InsData.Carrier.FreqMult)
  186. InsDataW(16) = ASC(InsData.Carrier.FeedBack)
  187. InsDataW(17) = ASC(InsData.Carrier.Attack)
  188. InsDataW(18) = ASC(InsData.Carrier.Sustain)
  189. InsDataW(19) = ASC(InsData.Carrier.Sustaining)
  190. InsDataW(20) = ASC(InsData.Carrier.Decay)
  191. InsDataW(21) = ASC(InsData.Carrier.Release)
  192. InsDataW(22) = ASC(InsData.Carrier.zOutput)
  193. InsDataW(23) = ASC(InsData.Carrier.AmpVib)
  194. InsDataW(24) = ASC(InsData.Carrier.FreqVib)
  195. InsDataW(25) = ASC(InsData.Carrier.EnvScale)
  196. InsDataW(26) = ASC(InsData.Carrier.SnythMode)
  197. InsDataW(27) = ASC(InsData.ModulatorWF)
  198. InsDataW(28) = ASC(InsData.CarrierWF)
  199.  
  200. LOCATE 23, 1
  201. IF InsData.Percussion = CHR$(1) THEN
  202.    PRINT "  PERCUSSION"
  203. ELSE
  204.    PRINT "  MELODIC   "
  205. END IF
  206. PRINT "  VOICE"; ASC(InsData.VoiceNum);
  207.  
  208. LOCATE 22, 20
  209. PRINT "KSL FqM FBk  AR  SL  SS  DR  RR  OL  AV  FV  ES  FM  WF"
  210. LOCATE 23, 14: PRINT "ModOp:";
  211. FOR ii = 1 TO 13
  212.    PRINT USING "### "; InsDataW(ii);
  213. NEXT
  214. PRINT USING "###"; InsDataW(27)
  215.  
  216. LOCATE 24, 14: PRINT "CarOp:";
  217. IF InsData.Percussion = CHR$(0) OR (InsData.Percussion = CHR$(1) AND ASC(InsData.VoiceNum) = 6) THEN
  218.    FOR ii = 14 TO 25
  219.       PRINT USING "### "; InsDataW(ii);
  220.    NEXT
  221.    PRINT USING "  - ###"; InsDataW(28);
  222. ELSE
  223.    FOR ii = 14 TO 26
  224.       PRINT "  - ";
  225.    NEXT
  226.    PRINT "  -";
  227. END IF
  228.  
  229. RETURN
  230.  
  231. PlayTune:
  232. FMFlush
  233. FMSetState 0
  234. FMSetRelTimeStart 0, 1
  235. FMSetActVoice ASC(InsData.VoiceNum)
  236. FMSetMode ASC(InsData.Percussion)
  237. stat = FMSetRelVolume(1, 1, 0, 1)
  238. stat = FMSetTempo(100, 0, 1)
  239. vseg = VARSEG(InsDataW(1))
  240. voff = VARPTR(InsDataW(1))
  241. FMSetWaveformParm 1
  242. stat = FMSetVoiceTimbre(vseg, voff, 0, 1)
  243. RESTORE
  244. READ Pitch, Duration, Delay
  245. DO UNTIL Pitch = 100
  246.    stat = FMPlayNote(Pitch, Duration, Delay)
  247.    READ Pitch, Duration, Delay
  248. LOOP
  249. FMSetState 1
  250. DO
  251.   FMGetState State
  252.   ikey$ = INKEY$
  253. LOOP WHILE State <> 0 AND ikey$ = ""
  254. IF State = 0 THEN ikey$ = CHR$(0) + CHR$(77)
  255. IF LEN(ikey$) = 2 THEN
  256.    ikey = 1000 + ASC(MID$(ikey$, 2, 1))
  257. ELSE
  258.    ikey = ASC(ikey$ + CHR$(0))
  259. END IF
  260. DO: LOOP WHILE INKEY$ <> ""
  261.  
  262. RETURN
  263.  
  264. REM SONG #1
  265. DATA 0, 1, 2
  266. DATA 2, 1, 2
  267. DATA 4, 3, 4
  268. DATA 7, 1, 4
  269. DATA 7, 1, 1
  270. DATA 4, 3, 4
  271. DATA 0, 1, 4
  272. DATA 4, 3, 2
  273. DATA 2, 1, 2
  274. DATA 0, 2, 1
  275.  
  276. REM SONG #2
  277. DATA 0,1,2,4,1,2,7,1,2,12,3,2,2,3,4,5,1,4,9,1,2,12,3,2
  278. DATA 11,3,4,9,1,4,7,1,2,5,1,1,2,1,2,4,1,1,9,1,2,7,3,2
  279. DATA 100, 100, 100
  280.  
  281.